/*
 * QueryFactory.java
 *
 * Created on 18 de diciembre de 2006, 02:15 PM
 *
 * To change this template, choose Tools | Options and locate the template under
 * the Source Creation and Management node. Right-click the template and choose
 * Open. You can then make changes to the template in the Source Editor.
 */

package com.src.computec.radar.consultas.ordenproceso.factory;

import static com.src.computec.radar.consultas.base.constantes.ConstantesGenerales.SCHEMA;
import com.src.computec.radar.consultas.ordenproceso.dto.BusquedaDto;
import com.src.computec.radar.consultas.ordenproceso.factory.exception.QueryFactoryException;
import com.src.computec.radar.consultas.source.ConsultasSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author aocampo
 */
public class QueryFactory {
    
    protected static QueryFactory queryFactory;
    public static final int DETALLES_ORDEN_PROCESO_BY_BUSQUEDA = 1;
    public static final int NUMERO_ENVIOS_BY_TIPO_GESTION_AND_BUSQUEDA = 2;
    public static final int NUMERO_ENVIOS_BY_GESTION_AND_BUSQUEDA = 3;
    public static final int NUMERO_IMAGENES_BY_BUSQUEDA = 4;
    public static final int DETALLES_EMPRESA_MENSAJERIA_NODO_BY_BUSQUEDA = 5;
    public static final int NUMERO_ENVIOS_BY_NODO_AND_BUSQUEDA = 6;
    public static final int NUMEROS_ORDENES_BY_BUSQUEDA = 7;
    public static final int ENVIOS_ORDENES_PROCESO_BY_NODO_AND_BUSQUEDA = 8;
    public static final int DETALLES_ORDEN_PROCESO_SECOND_BY_BUSQUEDA = 9;
    
    /**
     * Creates a new instance of QueryFactory 
     */
    public QueryFactory() {
    }
    
    public static QueryFactory getInstance() {
        if (queryFactory == null) {
            queryFactory = new QueryFactory();
        }
        return queryFactory;
    }
    
    public PreparedStatement getQuery(int i, Connection con, BusquedaDto dto) throws QueryFactoryException {
        switch (i) {
            case DETALLES_ORDEN_PROCESO_BY_BUSQUEDA: {
                return this.getDetallesOrdenProcesoByBusqueda(con, dto);
            }
            case NUMERO_ENVIOS_BY_TIPO_GESTION_AND_BUSQUEDA: {
                return this.getNumeroEnviosByTipoGestionAndBusqueda(con, dto);
            }
            case NUMERO_ENVIOS_BY_GESTION_AND_BUSQUEDA: {
                return this.getNumeroEnviosByGestionAndBusqueda(con, dto);
            }
            case NUMERO_IMAGENES_BY_BUSQUEDA: {
                return this.getNumeroImagenesByBusqueda(con, dto);
            }
            case DETALLES_EMPRESA_MENSAJERIA_NODO_BY_BUSQUEDA: {
                return this.getDetallesEmpresaMensajeriaNodoByBusqueda(con, dto);
            }
            case NUMERO_ENVIOS_BY_NODO_AND_BUSQUEDA: {
                return this.getNumeroEnviosByNodoAndBusqueda(con, dto);
            }
            case NUMEROS_ORDENES_BY_BUSQUEDA: {
                return this.getNumerosOrdenesByBusqueda(con, dto);
            }
            case ENVIOS_ORDENES_PROCESO_BY_NODO_AND_BUSQUEDA: {
                return this.getEnviosOrdenesProcesoByNodoAndBusqueda(con, dto);
            }
            case DETALLES_ORDEN_PROCESO_SECOND_BY_BUSQUEDA: {
                return this.getDetallesOrdenProcesoSecondByBusqueda(con, dto);
            }
        }
        return null;
    }
    
    private PreparedStatement getDetallesOrdenProcesoByBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
        String baseQuery = "SELECT OP.NUMERO_ORDEN, C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, OP.FECHA_PROCESO " +
                           "FROM " + SCHEMA + ".ORDEN_PROCESO OP ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".CLIENTE C ON OP.CODIGO_CLIENTE = C.CODIGO_CLIENTE " +
                                "INNER JOIN " + SCHEMA + ".PRODUCTO P ON OP.CODIGO_CLIENTE = P.CODIGO_CLIENTE AND OP.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO ";
        String baseWhere = "WHERE ";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += "OP.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "OP.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += "MONTH(OP.FECHA_PROCESO) = ? AND YEAR(OP.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND C.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND P.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getDetallesOrdenProcesoByBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getNumeroEnviosByTipoGestionAndBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT TGE.CODIGO_TIPO_GESTION, TGE.NOMBRE_TIPO_GESTION, COUNT(E.CODIGO_BARRAS) " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                "INNER JOIN " + SCHEMA + ".TIPO_GESTION_ENVIO TGE ON GE.CODIGO_TIPO_GESTION = TGE.CODIGO_TIPO_GESTION ";
        String baseWhere = "WHERE ";
        String baseGroupBy = " GROUP BY TGE.CODIGO_TIPO_GESTION, TGE.NOMBRE_TIPO_GESTION";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += "E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 0;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 0) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += " AND MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + baseGroupBy + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getNumeroEnviosByTipoGestionAndBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getNumeroEnviosByGestionAndBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT GE.CODIGO_GESTION, GE.NOMBRE_GESTION, COUNT(E.CODIGO_BARRAS) " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
        String baseWhere = "WHERE ";
        String baseGroupBy = " GROUP BY GE.CODIGO_GESTION, GE.NOMBRE_GESTION";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += "E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += " AND MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (!dto.getCodigoTipoGestion().equals("-1")) {
            baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
            listObjects.add(dto.getCodigoTipoGestion());
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + baseGroupBy + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getNumeroEnviosByGestionAndBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getNumeroImagenesByBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoGestionImagen = dto.getCodigoGestionImagen();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT COUNT(E.CODIGO_BARRAS) " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
        String baseWhere = "WHERE ";
        
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += "E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += " AND MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
        listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoTipoGestionEntrega"));
        if (!codigoGestionImagen.equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionImagenPendiente"))) {
            baseWhere += " AND E.PATH_IMAGEN IS NOT NULL";
        }
        else {
            baseWhere += " AND E.PATH_IMAGEN IS NULL";
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(dto.getCodigoProveedor());
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getNumeroImagenesByBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getDetallesEmpresaMensajeriaNodoByBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoGestion = dto.getCodigoTipoGestion();
        String codigoGestionImagen = dto.getCodigoGestionImagen();
        String codigoGestion = dto.getCodigoGestion();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT ND.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, E.CODIGO_NODO, ND.NOMBRE_NODO " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO " +
                                "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON ND.CODIGO_PROVEEDOR = P.CODIGO_PROVEEDOR ";
        String baseWhere = "WHERE ";
        String baseGroupBy = "GROUP BY ND.CODIGO_PROVEEDOR, P.RAZON_SOCIAL, E.CODIGO_NODO, ND.NOMBRE_NODO ";
        String baseOrderBy = "ORDER BY P.RAZON_SOCIAL, ND.NOMBRE_NODO";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += "E.NUMERO_ORDEN = ? ";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += "MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (codigoTipoGestion != null) {
            if (!codigoTipoGestion.equals("-1")) {
                baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
                baseWhere += "AND GE.CODIGO_TIPO_GESTION = ? ";
                listObjects.add(dto.getCodigoTipoGestion());
            }
        }
        else if (codigoGestionImagen != null) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
            baseWhere += "AND GE.CODIGO_TIPO_GESTION = ? ";
            listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoTipoGestionEntrega"));
            if (!codigoGestionImagen.equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionImagenPendiente"))) {
                baseWhere += "AND E.PATH_IMAGEN IS NOT NULL ";
            }
            else {
                baseWhere += "AND E.PATH_IMAGEN IS NULL ";
            }
        }
        if (codigoGestion != null && !codigoGestion.equals("")) {
            if (!codigoGestion.equals("-1")) {
                baseWhere += "AND E.CODIGO_ULTIMA_GESTION = ? ";
                listObjects.add(codigoGestion);
            }
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + baseGroupBy + baseOrderBy + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getDetallesEmpresaMensajeriaNodoByBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getNumeroEnviosByNodoAndBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoGestion = dto.getCodigoTipoGestion();
        String codigoGestionImagen = dto.getCodigoGestionImagen();
        String codigoGestion = dto.getCodigoGestion();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT COUNT(E.CODIGO_BARRAS) " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "";
        String baseWhere = "WHERE E.CODIGO_NODO = ?";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += " AND E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += " AND E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += " AND MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (codigoTipoGestion != null) {
            if (!codigoTipoGestion.equals("-1")) {
                baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
                baseWhere += "AND GE.CODIGO_TIPO_GESTION = ? ";
                listObjects.add(dto.getCodigoTipoGestion());
            }
        }
        else if (codigoGestionImagen != null) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
            baseWhere += "AND GE.CODIGO_TIPO_GESTION = ? ";
            listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoTipoGestionEntrega"));
            if (!codigoGestionImagen.equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionImagenPendiente"))) {
                baseWhere += " AND E.PATH_IMAGEN IS NOT NULL ";
            }
            else {
                baseWhere += " AND E.PATH_IMAGEN IS NULL ";
            }
        }
        if (codigoGestion != null && !codigoGestion.equals("")) {
            if (!codigoGestion.equals("-1")) {
                baseWhere += "AND E.CODIGO_ULTIMA_GESTION = ? ";
                listObjects.add(codigoGestion);
            }
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 1;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getNumeroEnviosByNodoAndBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getNumerosOrdenesByBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        Date fechaInicio = dto.getFechaInicio();
        Date fechaFin = dto.getFechaFin();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();        
        String baseQuery = "SELECT NUMERO_ORDEN " +
                           "FROM " + SCHEMA + ".ORDEN_PROCESO ";
        String baseWhere = "";
        if (mes != null && !mes.equals("") && anio != null && !anio.equals("")) {
            baseWhere = "WHERE MONTH(FECHA_PROCESO) = ? AND YEAR(FECHA_PROCESO) = ?";
            listObjects.add(mes);
            listObjects.add(anio);
        }
        else {
            baseWhere = "WHERE FECHA_PROCESO BETWEEN ? AND ?";
            listObjects.add(fechaInicio);
            listObjects.add(fechaFin);
        }
        if (!codigoCliente.equals("")) {
            if (!codigoCliente.equals("-1")) {
                baseWhere += " AND CODIGO_CLIENTE = ?";
                listObjects.add(codigoCliente);
            }
            else {
                baseWhere += " AND CODIGO_CLIENTE <> ?";
                listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoClienteComcel"));
            }
        }
        if (!codigoProducto.equals("")) {
            baseWhere += " AND CODIGO_PRODUCTO = ?";
            listObjects.add(codigoProducto);
        }
        if (!ciclo.equals("")) {
            baseWhere += " AND CICLO = ?";
            listObjects.add(ciclo);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseWhere + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                Object object = iterator.next();
                if (object instanceof String) {
                    statement.setObject(++indice, (String) object);
                }
                else {
                    statement.setDate(++indice, new java.sql.Date(((java.util.Date) object).getTime()));
                }
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getNumerosOrdenesByBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getEnviosOrdenesProcesoByNodoAndBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedorFilter = dto.getCodigoProveedorFilter();
        String codigoNodoFilter = dto.getCodigoNodoFilter();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoGestion = dto.getCodigoTipoGestion();
        String codigoGestionImagen = dto.getCodigoGestionImagen();
        String codigoGestion = dto.getCodigoGestion();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT E.CODIGO_BARRAS, E.NUMERO_ORDEN, D.NOMBRE_DEPARTAMENTO, M.NOMBRE_MUNICIPIO, CP.NOMBRE_CENTRO_POBLADO, GE.NOMBRE_GESTION, E.FECHA_ULTIMA_GESTION, P.RAZON_SOCIAL, ND.NOMBRE_NODO, C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, E.DIRECCION_DESTINATARIO, E.FECHA_PROCESO " +
                           "FROM " + SCHEMA + ".ENVIO E ";
        String baseInnerJoins = "INNER JOIN " + SCHEMA + ".DEPARTAMENTO D ON E.CODIGO_DEPARTAMENTO = D.CODIGO_DEPARTAMENTO " +
                                "INNER JOIN " + SCHEMA + ".MUNICIPIO M ON E.CODIGO_DEPARTAMENTO = M.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = M.CODIGO_MUNICIPIO " +
                                "INNER JOIN " + SCHEMA + ".CENTRO_POBLADO CP ON E.CODIGO_DEPARTAMENTO = CP.CODIGO_DEPARTAMENTO AND E.CODIGO_MUNICIPIO = CP.CODIGO_MUNICIPIO AND E.CODIGO_CENTROP = CP.CODIGO_CENTROP " + 
                                "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION " +
                                "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO " +
                                "INNER JOIN " + SCHEMA + ".PROVEEDOR P ON ND.CODIGO_PROVEEDOR = P.CODIGO_PROVEEDOR " +
                                "INNER JOIN " + SCHEMA + ".CLIENTE C ON E.CODIGO_CLIENTE = C.CODIGO_CLIENTE " +
                                "INNER JOIN " + SCHEMA + ".PRODUCTO P ON E.CODIGO_CLIENTE = P.CODIGO_CLIENTE AND E.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO ";
        String baseWhere = "WHERE ";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += " E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += "MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseInnerJoins += "INNER JOIN " + SCHEMA + ".ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN ";
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (codigoTipoGestion != null) {
            if (!codigoTipoGestion.equals("-1")) {
                baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
                listObjects.add(dto.getCodigoTipoGestion());
            }
        }
        else if (codigoGestionImagen != null) {
            baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
            listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoTipoGestionEntrega"));
            if (!codigoGestionImagen.equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionImagenPendiente"))) {
                baseWhere += " AND E.PATH_IMAGEN IS NOT NULL";
            }
            else {
                baseWhere += " AND E.PATH_IMAGEN IS NULL";
            }
        }
        if (codigoGestion != null && !codigoGestion.equals("")) {
            if (!codigoGestion.equals("-1")) {
                baseWhere += "AND E.CODIGO_ULTIMA_GESTION = ? ";
                listObjects.add(codigoGestion);
            }
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        else if (codigoProveedorFilter != null && !codigoProveedorFilter.equals("")) {
            if (!codigoProveedorFilter.equals("-1") && !codigoNodoFilter.equals("-1")) {
                baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
                listObjects.add(codigoProveedorFilter);
                if (codigoNodoFilter != null && !codigoNodoFilter.equals("")) {
                    baseWhere += " AND E.CODIGO_NODO = ?";
                    listObjects.add(codigoNodoFilter);
                }
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getEnviosOrdenesProcesoByNodoAndBusqueda:" + e.toString(), e);
        }
    }
    
    private PreparedStatement getDetallesOrdenProcesoSecondByBusqueda(Connection con, BusquedaDto dto) throws QueryFactoryException {
        List listObjects = new ArrayList();
        PreparedStatement statement = null;
        String mes = dto.getMes();
        String anio = dto.getAnio();
        String codigoCliente = dto.getCodigoCliente();
        String codigoProducto = dto.getCodigoProducto();
        String ciclo = dto.getCiclo();
        String codigoProveedorFilter = dto.getCodigoProveedorFilter();
        String codigoNodoFilter = dto.getCodigoNodoFilter();
        String codigoProveedor = dto.getCodigoProveedor();
        String codigoNodo = dto.getCodigoNodo();
        String codigoTipoEnvio = dto.getCodigoTipoEnvio();
        String codigoTipoGestion = dto.getCodigoTipoGestion();
        String codigoGestionImagen = dto.getCodigoGestionImagen();
        String codigoGestion = dto.getCodigoGestion();
        String codigoTipoBusqueda = dto.getCodigoTipoBusqueda();
	String codigoSegmentoProducto = dto.getCodigoSegmentoPrd();
        String codigoRegional = dto.getCodigoRegional();
        String baseQuery = "SELECT OP.NUMERO_ORDEN, C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, OP.FECHA_PROCESO, OP.CICLO, COUNT(E.CODIGO_BARRAS) AS NUMERO_ENVIOS,C.CODIGO_CLIENTE " +
                           "FROM PRODRAD.ENVIO E ";
        String baseInnerJoins = "INNER JOIN PRODRAD.ORDEN_PROCESO OP ON E.NUMERO_ORDEN = OP.NUMERO_ORDEN " +
                                "INNER JOIN PRODRAD.CLIENTE C ON OP.CODIGO_CLIENTE = C.CODIGO_CLIENTE " +
                                "INNER JOIN PRODRAD.PRODUCTO P ON OP.CODIGO_CLIENTE = P.CODIGO_CLIENTE AND OP.CODIGO_PRODUCTO = P.CODIGO_PRODUCTO ";
        String baseWhere = "WHERE ";
        String baseGroupBy = " GROUP BY OP.NUMERO_ORDEN, C.RAZON_SOCIAL, P.DESCRIPCION_PRODUCTO, OP.FECHA_PROCESO, OP.CICLO,C.CODIGO_CLIENTE";
        if (codigoTipoBusqueda.equals("1")) {
            baseWhere += " E.NUMERO_ORDEN = ?";
            listObjects.add(dto.getNumeroOrden());
        }
        else if (codigoTipoBusqueda.equals("2")) {
            List listNumerosOrdenes = dto.getListNumerosOrdenes();
            if (listNumerosOrdenes != null) {
                baseWhere += "E.NUMERO_ORDEN IN (";
                Iterator iterator = listNumerosOrdenes.iterator();
                int indice = 1;
                while (iterator.hasNext()) {
                    String numeroOrden = (String) iterator.next();
                    if (indice == 1) {
                        baseWhere += "?";
                        indice++;
                    }
                    else {
                        baseWhere += ", ?";
                    }
                    listObjects.add(numeroOrden);
                }
                baseWhere += ")";
            }
            else {
                baseWhere += "MONTH(E.FECHA_PROCESO) = ? AND YEAR(E.FECHA_PROCESO) = ?";
                listObjects.add(mes);
                listObjects.add(anio);
                if (codigoCliente != null && !codigoCliente.equals("")) {
                    baseWhere += " AND E.CODIGO_CLIENTE = ?";
                    listObjects.add(codigoCliente);
                    if (codigoProducto != null && !codigoProducto.equals("")) {
                        baseWhere += " AND E.CODIGO_PRODUCTO = ?";
                        listObjects.add(codigoProducto);
                    }
                }
                if (ciclo != null && !ciclo.equals("")) {
                    baseWhere += " AND OP.CICLO = ?";
                    listObjects.add(ciclo);
                }
            }
        }
        if (codigoTipoGestion != null) {
            if (!codigoTipoGestion.equals("-1")) {
                baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
                baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
                listObjects.add(dto.getCodigoTipoGestion());
            }
        }
        else if (codigoGestionImagen != null) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".GESTION_ENVIO GE ON E.CODIGO_ULTIMA_GESTION = GE.CODIGO_GESTION ";
            baseWhere += " AND GE.CODIGO_TIPO_GESTION = ?";
            listObjects.add(ConsultasSource.getInstance().getConsultasSetupKey("codigoTipoGestionEntrega"));
            if (!codigoGestionImagen.equals(ConsultasSource.getInstance().getConsultasSetupKey("codigoGestionImagenPendiente"))) {
                baseWhere += " AND E.PATH_IMAGEN IS NOT NULL";
            }
            else {
                baseWhere += " AND E.PATH_IMAGEN IS NULL";
            }
        }
        if (codigoGestion != null && !codigoGestion.equals("")) {
            if (!codigoGestion.equals("-1")) {
                baseWhere += "AND E.CODIGO_ULTIMA_GESTION = ? ";
                listObjects.add(codigoGestion);
            }
        }
        if (codigoSegmentoProducto != null && !codigoSegmentoProducto.equals("")) {
            baseWhere += " AND E.CODIGO_SEGMENTO_PRODUCTO = ?";
            listObjects.add(codigoSegmentoProducto);
        }
        if (codigoRegional != null && !codigoRegional.equals("")) {
            baseWhere += " AND E.CODIGO_REGIONAL = ?";
            listObjects.add(codigoRegional);
        }
        if (codigoProveedor != null && !codigoProveedor.equals("")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedor);
            if (codigoNodo != null && !codigoNodo.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodo);
            }
        }
        else if (codigoProveedorFilter != null && !codigoProveedorFilter.equals("") && !codigoProveedorFilter.equals("-1")) {
            baseInnerJoins += "INNER JOIN " + SCHEMA + ".NODO_DISTRIBUCION ND ON E.CODIGO_NODO = ND.CODIGO_NODO ";
            baseWhere += " AND ND.CODIGO_PROVEEDOR = ?";
            listObjects.add(codigoProveedorFilter);
            if (codigoNodoFilter != null && !codigoNodoFilter.equals("")) {
                baseWhere += " AND E.CODIGO_NODO = ?";
                listObjects.add(codigoNodoFilter);
            }
        }
        if (codigoTipoEnvio != null && !codigoTipoEnvio.equals("")) {
            baseWhere += " AND E.CODIGO_TIPO_ENVIO = ?";
            listObjects.add(codigoTipoEnvio);
        }
        try {
            int indice = 0;
            statement = con.prepareStatement(baseQuery + baseInnerJoins + baseWhere + baseGroupBy + " WITH UR");
            Iterator iterator = listObjects.iterator();
            while (iterator.hasNext()) {
                statement.setObject(++indice, (String) iterator.next());
            }
            return statement;
        }
        catch (SQLException e) {
            throw new QueryFactoryException("QueryFactory:getDetallesOrdenProcesoSecondByBusqueda:" + e.toString(), e);
        }
    }
}